﻿/*
 ***************************************************************************
 * Microsoft Visual C# .NET
 * 名称：       Shpm.System.Web.Control.CheckDateRange
 * 类型：       服务端输入校验类
 * 功能说明：   日期项目校验类
 * 作者：       郭晓庆
 * 创建日期：   2007/07/10
 * 修改日期     修改者      修改内容
 * 
 * 
 * ---
 ***************************************************************************
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Data;
using System.Globalization;
using Shpm.App.Commons.Utils;

namespace Shpm.System.Web.Control
{
    public class CheckDate : ComAbsChecker
    {
        /** 合法的日期格式 */
        protected String dataFormat;

        /**
         * 构造函数
         * @param value   		输入值
         * @param msg     		消息管理类
         */
        public CheckDate(String value, String dataFormat)
            : base(value)
        {
            this.dataFormat = dataFormat;
        }

        /**
         * 构造函数
         * @param value   		输入值
         * @param msg     		消息管理类
         */
        public CheckDate(String value)
            : base(value)
        {
            // 不特定日期格式
            this.dataFormat = null;
        }

        public CheckDate(string value, String dataFormat, Shpm.System.Validator.ComAbsMsg msg)
            : base(value, msg)
        {
            this.dataFormat = dataFormat;
        }

        public CheckDate(string value, Shpm.System.Validator.ComAbsMsg msg)
            : base(value, msg)
        {
            // 不特定日期格式
            this.dataFormat = null;
        }


        /**
         * 元素检查处理。
         * @param value 输入值
         * @return true:合法 / false:不合法
         */
        protected override bool doCheck(String value)
        {

            // 未输入值返回合法
            if (base.isEmpty(value))
            {
                return true;
            }

            int cnt = 0;
            for (int i = 0; i < value.Length; i++)
            {
                char c = value[i];
                if (Char.IsDigit(c) == false)
                {
                    cnt++;

                }
                if (3 <= cnt)
                {
                    return false;
                }
            }

            // 日期解析
            return this.parse(value);

        }

        /**
         * 解析日期
         * @return true:正常 / false:异常
         */
        private bool parse(String value)
        {
            try
            {
                // 日期解析
                Nullable<DateTime> da = null;

                if (this.dataFormat != null)
                {
                    da = DateTime.ParseExact(value, dataFormat, DateTimeFormatInfo.InvariantInfo);
                }
                else
                {
                    da = DateUtils.convertToDate(value);
                }

                if (da != null)
                {
                    Calendar myCal = CultureInfo.InvariantCulture.Calendar;
                    if (Convert.ToString(myCal.GetYear(da.Value)).Length != 4)
                    {
                        return false;
                    }
                    return true;
                }
                else
                    return false;
            }
            catch
            {
                return false;
            }
        }
    }
}
